package come.bjpowernode.javase.volatileTest;

import java.util.concurrent.atomic.AtomicInteger;

public class VolatileAtomicTest {
    public static void main(String[] args) {
        myThread volatileAtomicThread = new myThread() ;

        for (int i = 0; i < 100; i++) {
            new Thread(volatileAtomicThread).start();
        }
    }

}

class myThread implements Runnable{
    /**
     * 在多线程环境下，volatile关键字可以保证共享数据的可见性，但是并不能保证对数据操作的原子性（在多线程环境下volatile修饰的变量也是线程不安全的）。
     * 在多线程环境下，要保证数据的安全性，我们还需要使用锁机制。
     */
    private volatile int count = 0;

    private AtomicInteger atomicInteger = new AtomicInteger() ;


    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            count++;
            System.out.println("count=="+count);
//            int andIncrement = atomicInteger.getAndIncrement();
            int andIncrement = atomicInteger.incrementAndGet();
            System.out.println("atomicInteger=="+andIncrement);
        }

    }

    /*@Override
    public void run() {
        synchronized (this){
            for (int i = 0; i < 1000; i++) {
                count++;
                System.out.println("count=="+count);
            }
        }
    }*/
}